Some software applications grow according to changing requirements, without any particular design or plan. Other software applications are initially implemented according to a design, where the design is later compromised. In some instances, the design of a software application is compromised by later additions and features not initially contemplated. In other instances, the design of a software application is compromised through a lack of understanding by a maintenance programmer. In still other instances, introduction of new language features or code libraries may allow for a simpler implementation than was possible at the time at which a software application was originally designed or implemented.
Due to the complexity involved, continued maintenance of poorly designed software applications may be costly compared to maintenance of software applications with a clear design. Moreover, maintenance of such poorly designed software applications may cause undesirable side effects and problems due to unforeseen dependencies and issues. On the other hand, replacement of such software applications may also be costly and may introduce bugs or other issues into the software applications.